home *** CD-ROM | disk | FTP | other *** search
/ Die Ultimative Software-P…i Collection 1996 & 1997 / Die Ultimative Software-Pakete CD-ROM fur Atari Collection 1996 & 1997.iso / tt / fnt_ed / fnt_ed.lst < prev    next >
Encoding:
File List  |  1996-09-18  |  19.7 KB  |  881 lines

  1. vers$=" FNT_ED.GFA, V.1/o, 4.April.91, ATARI-ST/TT, v.Pfr.S.Just,6936 Haag,Kirchweg 5 "
  2. '
  3. ON ERROR GOSUB schluss
  4. ON BREAK GOSUB schluss
  5. ON MENU KEY GOSUB m_getkey
  6. ON MENU GOSUB m_deal
  7. '
  8. @init
  9. @main
  10. @schluss
  11. END
  12. '
  13. PROCEDURE m_init
  14.  LOCAL h%,n%,nmax%,mmax%,hx%,d%,i%,dummy%,h$
  15.  '
  16.  scrn_breit_pix%=WORK_OUT(0)
  17.  scrn_hoeh_pix%=WORK_OUT(1)
  18.  scrn_mono!=(WORK_OUT(35)=0)
  19.  scrn_breit_byt%=INT{L~A+2}
  20.  '
  21.  esc$=CHR$(27)
  22.  inv$=esc$+"p"
  23.  norm$=esc$+"q"
  24.  '
  25. m_dat:
  26.  ' MERGE-Punkt
  27.  DATA Desk ,0,  CLS,0,----------------,0, ,0, ,0, ,0, ,0, ,0, ,0, ,0,""
  28.  DATA Datei ,0, Laden,1, Speichern,2,------,0, QUIT,3,""
  29.  DATA Font ,0, WechsleFont,4, Blank,6, System-Font,7, Invers,8, dünner,9, fetter,10, rotieren,23,- Horizontal<>,0, spiegeln,0, dehnen,0, stauchen,0,-Vertikal ^v,0, spiegeln,0, dehnen,0, stauchen,0,""
  30.  DATA Buchstabe ,0,-Auch Direkt!,0, Copy->Puffer,15, Paste,16, Kill,17, Invers,18, Tauschen,19, dünner,20, fetter,21,- Horizontal<>,0, spiegeln,0, dehnen,0, stauchen,0,- Vertikal ^v,0, spiegeln,0, dehnen,0, stauchen,0,""
  31.  DATA Hilfen ,0, Raster,25,-----,0, Hilfe-Seite,22,""
  32.  DATA ""
  33.  '
  34.  ' Finde DIM-Grenzen
  35.  RESTORE m_dat
  36.  h%=0
  37.  nmax%=0
  38.  mmax%=0
  39.  DO
  40.   READ h$
  41.   EXIT IF h$=""
  42.   READ dummy%
  43.   INC h%
  44.   n%=0
  45.   DO
  46.    READ h$
  47.    EXIT IF h$=""
  48.    READ dummy%
  49.    INC n%
  50.   LOOP
  51.   IF h%=1 THEN
  52.    mmax%=n%
  53.   ELSE
  54.    nmax%=MAX(nmax%,n%)
  55.   ENDIF
  56.  LOOP
  57.  DEC h%
  58.  m.hs%=h%
  59.  m.nmax%=nmax%
  60.  DIM m.titel$(mmax%)
  61.  DIM m.h_titl$(m.hs%+1),m.hx%(m.hs%+1),m.he%(m.hs%+1),m.hc$(m.hs%+1),m.ne%(m.hs%+1),m.ns%(m.hs%+1),m.ns_pix%(m.hs%+1)
  62.  DIM m.n_titl$(m.hs%+1,m.nmax%+1),m.nc$(m.hs%+1,m.nmax%+1),m.nc_p%(m.hs%+1,m.nmax%+1),m.n_geht!(m.hs%+1,m.nmax%+1),m.com_nr%(m.hs%+1,m.nmax%+1)
  63.  ARRAYFILL m.hx%(),0
  64.  ARRAYFILL m.he%(),0
  65.  ARRAYFILL m.ns%(),0
  66.  ARRAYFILL m.ns_pix%(),19
  67.  ARRAYFILL m.ne%(),0
  68.  ARRAYFILL m.nc_p%(),0
  69.  ARRAYFILL m.com_nr%(),0
  70.  ARRAYFILL m.n_geht!(),TRUE
  71.  '
  72.  ' Fuelle Arrays, Finde Grenzen
  73.  RESTORE m_dat
  74.  h%=0
  75.  DO
  76.   READ h$
  77.   EXIT IF h$=""
  78.   READ dummy%
  79.   m.titel$(h%)=h$
  80.   INC h%
  81.  LOOP
  82.  '
  83.  h%=0
  84.  hx%=80 ! Linker Rand eines Menues
  85.  DO
  86.   READ h$
  87.   EXIT IF h$=""
  88.   READ dummy%
  89.   INC h%
  90.   m.h_titl$(h%)=h$
  91.   m.hc$(h%)=LEFT$(h$,1)
  92.   m.hx%(h%)=hx%
  93.   ADD hx%,SHL(ADD(LEN(h$),1),3)
  94.   m.he%(h%)=SUB(hx%,8)
  95.   IF m.he%(h%)>scrn_breit_pix% THEN
  96.    ALERT 1,"Menü|zu lang!",1,"WEITER",d%
  97.   ENDIF
  98.   n%=0
  99.   DO
  100.    READ h$
  101.    EXIT IF h$=""
  102.    INC n%
  103.    READ m.com_nr%(h%,n%)
  104.    m.n_titl$(h%,n%)=h$
  105.    m.ne%(h%)=MAX(m.ne%(h%),SHL(ADD(LEN(h$),1),3))
  106.    IF LEFT$(h$,1)="-" THEN
  107.     m.n_geht!(h%,n%)=FALSE
  108.    ELSE
  109.     i%=0
  110.     REPEAT
  111.      INC i%
  112.     UNTIL MID$(h$,i%,1)>"@" OR i%=LEN(h$)
  113.     IF i%<LEN(h$) THEN
  114.      m.nc$(h%,n%)=MID$(h$,i%,1)
  115.      DEC i%
  116.      m.nc_p%(h%,n%)=SHL(i%,3)
  117.     ENDIF
  118.    ENDIF
  119.   LOOP
  120.   ADD m.ne%(h%),m.hx%(h%)
  121.   m.ns%(h%)=n%
  122.   ADD m.ns_pix%(h%),ADD(SHL(n%,4),2)
  123.  LOOP
  124.  '
  125.  MENU m.titel$()
  126.  DEFMOUSE 0
  127.  m.key&=0
  128.  ABSOLUTE m.asc|,V:m.key&+1
  129.  ABSOLUTE m.scan|,V:m.key&
  130.  '
  131. RETURN ! m_init
  132. '
  133. PROCEDURE init
  134.  LOCAL l%,j%,a%
  135.  @m_init
  136.  INLINE fnt1%,4096
  137.  INLINE fnt2%,4096
  138.  INLINE sysfnt%,4096
  139.  fntadr%=fnt1%
  140.  fnt$="SYSTEM.FNT"
  141.  a%={L~A-22}
  142.  FOR l%=0 TO 255
  143.   FOR j%=0 TO 15
  144.    BYTE{fnt2%+SHL(l%,4)+j%}=BYTE{a%+l%+MUL(j%,256)}
  145.   NEXT j%
  146.  NEXT l%
  147.  '
  148.  cltoeol$=esc$+"K"
  149.  cltoeop$=esc$+"J"
  150.  '
  151.  u_raster!=FALSE
  152.  chr%=65 ! A
  153.  scrn%=XBIOS(2)
  154.  DIM cpuf|(15)
  155.  ARRAYFILL cpuf|(),0
  156.  '
  157.  @m_aufbau
  158. RETURN ! init
  159. '
  160. PROCEDURE m_aufbau
  161.  LOCAL i%
  162.  DEFFILL 1,2,7
  163.  PBOX 0,0,scrn_breit_pix%,scrn_hoeh_pix%
  164.  DEFFILL 0,0
  165.  PBOX 0,0,scrn_breit_pix%,17
  166.  IF scrn_breit_byt%=160 THEN
  167.   DEFTEXT ,4,,6
  168.   TEXT 16,8,"Desk"
  169.   tt!=TRUE
  170.  ELSE
  171.   DEFTEXT ,4,,13
  172.   TEXT 16,13,"Desk"
  173.   tt!=FALSE
  174.  ENDIF
  175.  DEFTEXT ,1,,13
  176.  FOR i%=1 TO m.hs%
  177.   TEXT m.hx%(i%),13,m.h_titl$(i%)
  178.   LINE ADD(m.hx%(i%),1),15,ADD(m.hx%(i%),6),15
  179.  NEXT i%
  180.  LINE 0,17,scrn_breit_pix%,17
  181.  LINE 0,18,scrn_breit_pix%,18
  182.  @fnt_anzeige
  183.  ' PRINT AT(80,25);"X";
  184.  PRINT AT(47,3);inv$;
  185.  OUT 5,32,1,32
  186.  PRINT AT(47,20);
  187.  OUT 5,32,2,32
  188.  PRINT AT(37,11);
  189.  OUT 5,32,4,32
  190.  PRINT AT(56,11);
  191.  OUT 5,32,3,32
  192.  PRINT norm$;
  193.  PRINT AT(41,22);" ";inv$;" x ";norm$;" oder x oder 'Buchstabe' ";
  194.  PRINT AT(41,23);" Direkt über        -Menü    ";
  195.  PRINT AT(41,24);" die Tastatur                ";
  196.  LINE 400,352,408,352
  197.  LINE 464,352,472,352
  198.  DEFTEXT ,4,2700,13
  199.  TEXT 600,22," FNT_ED.GFA v.Pfr.S.Just,Kirchweg 5,6936 Haag "
  200.  DEFTEXT ,1
  201.  TEXT 580,102," P U B L I C - D O M A I N "
  202.  DEFTEXT ,0,,8
  203.  TEXT 564,32," GFABasic 3.5E auf ATARI-TT+TTM194 "
  204.  DEFTEXT ,0,0,13
  205. RETURN ! m_aufbau
  206. '
  207. PROCEDURE fnt_anzeige
  208.  LOCAL x%,y%,c%,i%,j%,z%,adr%,fadr%
  209.  DEFFILL 0,0
  210.  PBOX 14,28,274,384
  211.  x%=3
  212.  y%=SHL(scrn_breit_byt%,5)
  213.  scrn%=XBIOS(2)
  214.  c%=0
  215.  FOR i%=0 TO 15
  216.   adr%=MUL(i%,22)
  217.   IF u_raster! THEN
  218.    DEFLINE 3
  219.    LINE 14,32+adr%,274,32+adr%
  220.    LINE 14,32+adr%+2,274,32+adr%+2
  221.    LINE 14,32+adr%+8,274,32+adr%+8
  222.    LINE 14,32+i%*22+11,274,32+i%*22+11
  223.   ENDIF
  224.   FOR j%=0 TO 15
  225.    c%=SHL(i%,4)
  226.    ADD c%,j%
  227.    adr%=MUL(i%,22)
  228.    SUB adr%,3
  229.    MUL adr%,scrn_breit_byt%
  230.    ADD adr%,scrn%
  231.    ADD adr%,y%
  232.    ADD adr%,ADD(j%,j%)
  233.    ADD adr%,x%
  234.    fadr%=SHL(c%,4)
  235.    ADD fadr%,fntadr%
  236.    FOR z%=0 TO 15
  237.     BYTE{adr%}=BYTE{ADD(fadr%,z%)}
  238.     ADD adr%,scrn_breit_byt%
  239.    NEXT z%
  240.   NEXT j%
  241.  NEXT i%
  242.  DEFLINE 0
  243.  PRINT AT(1,3);inv$;" - ";AT(35,24);" + ";norm$;
  244.  @box_um_char(FALSE)
  245.  @char_anzeige
  246. RETURN ! fnt_anzeige
  247. '
  248. PROCEDURE char_anzeige
  249.  LOCAL i%,j%,w$
  250.  FOR i%=0 TO 15
  251.   w$=BIN$(BYTE{fntadr%+chr%*16+i%},8)
  252.   PRINT AT(40,4+i%);
  253.   FOR j%=1 TO 8
  254.    IF MID$(w$,j%,1)="1" THEN
  255.     PRINT "XX";
  256.    ELSE
  257.     PRINT "  ";
  258.    ENDIF
  259.   NEXT j%
  260.  NEXT i%
  261.  FOR i%=0 TO 15
  262.   j%=SHL(i%,4)
  263.   ADD j%,48
  264.   LINE 312,j%,440,j%
  265.   IF i%=2 OR i%=5 OR i%=13 OR i%=14 THEN
  266.    LINE 312,j%+1,440,j%+1
  267.   ENDIF
  268.  NEXT i%
  269.  FOR i%=0 TO 7
  270.   j%=SHL(i%,4)
  271.   ADD j%,312
  272.   LINE j%,48,j%,304
  273.   IF i%=1 OR i%=7 THEN
  274.    LINE j%+1,48,j%+1,304
  275.   ENDIF
  276.  NEXT i%
  277. RETURN ! char_anzeige
  278. '
  279. PROCEDURE box_um_char(weg!)
  280.  LOCAL x%,y%
  281.  y%=SHR(chr%,4)
  282.  x%=SUB(chr%,SHL(y%,4))
  283.  y%=ADD(28,MUL(y%,22))
  284.  x%=ADD(23,SHL(x%,4))
  285.  IF weg! THEN
  286.   GRAPHMODE 3
  287.  ENDIF
  288.  BOX x%,y%,x%+9,y%+17
  289.  GRAPHMODE 1
  290. RETURN ! box_um_char
  291. '
  292. PROCEDURE char_wahl(mx%,my%)
  293.  @box_um_char(TRUE)
  294.  SUB mx%,24
  295.  DIV mx%,16
  296.  SUB my%,31
  297.  DIV my%,22
  298.  chr%=ADD(SHL(my%,4),mx%)
  299.  chr%=MAX(0,chr%)
  300.  chr%=MIN(chr%,255)
  301.  @char_anzeige
  302.  @box_um_char(FALSE)
  303. RETURN ! char_wahl
  304. '
  305. PROCEDURE bit_change(mx%,my%,mk%)
  306.  LOCAL adr%,w$,j%,i%,c%,fadr%,z%
  307.  SUB mx%,312
  308.  DIV mx%,16
  309.  mx%=SUB(7,mx%)
  310.  SUB my%,48
  311.  DIV my%,16
  312.  adr%=SHL(chr%,4)
  313.  ADD adr%,fntadr%
  314.  ADD adr%,my%
  315.  IF mk%=1 THEN
  316.   BYTE{adr%}=BSET(BYTE{adr%},mx%)
  317.  ELSE
  318.   BYTE{adr%}=BCLR(BYTE{adr%},mx%)
  319.  ENDIF
  320.  @update_line(my%)
  321.  @update_char
  322.  PAUSE 10
  323. RETURN ! bit_change
  324. '
  325. PROCEDURE update_line(l%)
  326.  LOCAL adr%,i%,j%,z%,w$
  327.  adr%=SHL(chr%,4)
  328.  ADD adr%,fntadr%
  329.  ADD adr%,l%
  330.  w$=BIN$(BYTE{adr%},8)
  331.  PRINT AT(40,4+l%);
  332.  FOR j%=1 TO 8
  333.   IF MID$(w$,j%,1)="1" THEN
  334.    PRINT "XX";
  335.   ELSE
  336.    PRINT "  ";
  337.   ENDIF
  338.  NEXT j%
  339.  FOR i%=0 TO 7
  340.   j%=SHL(i%,4)
  341.   ADD j%,312
  342.   LINE j%,48+l%*16,j%,48+16+l%*16
  343.   IF i%=1 OR i%=7 THEN
  344.    LINE j%+1,48+l%*16,j%+1,48+16+l%*16
  345.   ENDIF
  346.  NEXT i%
  347.  j%=SHL(l%,4)
  348.  ADD j%,48
  349.  LINE 312,j%,440,j%
  350.  IF l%=2 OR l%=5 OR l%=13 OR l%=14 THEN
  351.   LINE 312,j%+1,440,j%+1
  352.  ENDIF
  353. RETURN ! update_line
  354. '
  355. PROCEDURE update_char
  356.  LOCAL i%,j%,z%,adr%,fadr%
  357.  i%=SHR(chr%,4)
  358.  j%=chr%
  359.  SUB j%,SHL(i%,4)
  360.  adr%=MUL(i%,22)
  361.  SUB adr%,3
  362.  MUL adr%,scrn_breit_byt%
  363.  ADD adr%,scrn%
  364.  ADD adr%,SHL(scrn_breit_byt%,5)
  365.  ADD adr%,ADD(j%,j%)
  366.  ADD adr%,3
  367.  fadr%=SHL(chr%,4)
  368.  ADD fadr%,fntadr%
  369.  FOR z%=0 TO 15
  370.   BYTE{adr%}=BYTE{ADD(fadr%,z%)}
  371.   ADD adr%,scrn_breit_byt%
  372.  NEXT z%
  373. RETURN ! update_char
  374. '
  375. PROCEDURE main
  376.  LOCAL idx%,t$,htitl$,hmen$,ntitl$,nmen$,oldhidx%,dummy%,abbruch!,no%,w%,hopen!,hidx%,nidx%
  377.  '
  378.  hopen!=FALSE
  379.  abbruch!=FALSE
  380.  '
  381.  DO
  382.   m.key&=0
  383.   '
  384.   SHOWM
  385.   REPEAT
  386.    '
  387.    ON MENU
  388.    MOUSE mx%,my%,mk%
  389.    ' PRINT AT(50,1);mx%;"|";my%;" ";
  390.    '
  391.    IF mx%>80 AND mx%<m.he%(m.hs%) THEN
  392.     ' Maus im moeglichen Menuebereich
  393.     IF my%<18 THEN
  394.      ' Maus im Menueleisten-Bereich
  395.      idx%=0
  396.      REPEAT
  397.       INC idx%
  398.      UNTIL (mx%>m.hx%(idx%) AND mx%<m.he%(idx%)) OR idx%>m.hs%
  399.      IF idx%<=m.hs% THEN
  400.       ' Gueltiger Hauptmenue-Index
  401.       IF idx%<>hidx% THEN
  402.        IF hidx%>0 THEN
  403.         PUT m.hx%(hidx%),1,htitl$
  404.         PUT m.hx%(hidx%),19,nmen$
  405.        ENDIF
  406.        hidx%=idx%
  407.        oldhidx%=idx%
  408.        GET m.hx%(hidx%),1,m.he%(hidx%),15,htitl$
  409.        PUT m.hx%(hidx%),1,htitl$,10
  410.        GET m.hx%(hidx%),19,m.ne%(hidx%),m.ns_pix%(hidx%),nmen$
  411.        DEFFILL 0,0
  412.        PBOX m.hx%(hidx%),19,m.ne%(hidx%),m.ns_pix%(hidx%)
  413.        BOX m.hx%(hidx%),19,m.ne%(hidx%),m.ns_pix%(hidx%)
  414.        FOR i%=1 TO m.ns%(hidx%)
  415.         IF m.n_geht!(hidx%,i%) THEN
  416.          DEFTEXT ,0,,13
  417.         ELSE
  418.          DEFTEXT ,2,,13
  419.         ENDIF
  420.         TEXT m.hx%(hidx%)+2,17+i%*16,m.n_titl$(hidx%,i%)
  421.         IF m.n_geht!(hidx%,i%) AND m.nc$(hidx%,i%)<"[" THEN
  422.          LINE m.hx%(hidx%)+3+m.nc_p%(hidx%,i%),19+i%*16,m.hx%(hidx%)+9+m.nc_p%(hidx%,i%),19+i%*16
  423.         ENDIF
  424.        NEXT i%
  425.        hopen!=TRUE
  426.       ENDIF
  427.      ENDIF
  428.     ELSE
  429.      ' Maus im Bereich der Nebenmenues unter der Hauptmenue-Leiste
  430.      IF hopen! THEN
  431.       ' Nebenmenue aufgeklappt, sonst KEINE Aktion!
  432.       IF my%>19 AND my%<m.ns_pix%(hidx%) AND mx%>m.hx%(hidx%) AND mx%<m.ne%(hidx%) THEN
  433.        ' Maus im exakten Nebenmenue-Bereich
  434.        SUB my%,19
  435.        idx%=MIN(m.ns%(hidx%),ADD(SHR(my%,4),1))
  436.        IF idx%<>nidx% THEN
  437.         ' Nur wenn sich der Index geaendert hat!
  438.         IF nidx%>0 THEN
  439.          ' Alten Nebenmenue-Index, sofern schon invertiert, restaurieren
  440.          PUT m.hx%(hidx%)+2,5+nidx%*16,ntitl$
  441.         ENDIF
  442.         ' Endlich!
  443.         nidx%=idx%
  444.         IF m.n_geht!(hidx%,nidx%) THEN
  445.          GET m.hx%(hidx%)+2,5+nidx%*16,m.ne%(hidx%)-2,20+nidx%*16,ntitl$
  446.          PUT m.hx%(hidx%)+2,5+nidx%*16,ntitl$,10
  447.         ELSE
  448.          nidx%=0
  449.         ENDIF
  450.        ENDIF
  451.       ELSE
  452.        ' Maus ausserhalb des Nebenmenue-Bereiches
  453.        IF nidx%>0 THEN
  454.         PUT m.hx%(hidx%)+2,5+nidx%*16,ntitl$
  455.        ENDIF
  456.        nidx%=0
  457.       ENDIF
  458.      ENDIF
  459.     ENDIF
  460.    ELSE
  461.     IF mx%<80 OR mx%>m.ne%(m.hs%) THEN
  462.      ' Maus ausserhalb des rechten Randes
  463.      IF nidx%>0 THEN
  464.       PUT m.hx%(hidx%)+2,5+nidx%*16,ntitl$
  465.      ENDIF
  466.      nidx%=0
  467.     ENDIF
  468.     IF mx%<80 AND my%<18 THEN
  469.      ' Maus zeigt auf DESKTOP-Eintrag!
  470.      IF hidx%>0 THEN
  471.       ' Falls Nebenmenue offen und Hauptmenuepunkt invertiert: Zuklappen
  472.       PUT m.hx%(hidx%),1,htitl$
  473.       PUT m.hx%(hidx%),19,nmen$
  474.      ENDIF
  475.      hidx%=0
  476.      hopen!=FALSE
  477.     ENDIF
  478.    ENDIF
  479.   UNTIL m.key&>0 OR mk%>0
  480.   HIDEM
  481.   '
  482.   IF mk%>0 THEN
  483.    IF mx%>24 AND mx%<270 AND my%>31 AND my%<374 THEN
  484.     IF NOT hopen! THEN
  485.      @char_wahl(mx%,my%)
  486.     ENDIF
  487.    ENDIF
  488.    IF mx%>312 AND mx%<440 AND my%>48 AND my%<302 THEN
  489.     IF NOT hopen! THEN
  490.      @bit_change(mx%,my%,mk%)
  491.     ENDIF
  492.    ENDIF
  493.    ' Menuepunkt angeklickt
  494.    IF nidx%>0 THEN
  495.     PUT m.hx%(hidx%)+2,5+nidx%*16,ntitl$
  496.    ENDIF
  497.    IF hidx%>0 THEN
  498.     ' Falls Nebenmenue offen und Hauptmenuepunkt invertiert: Zuklappen
  499.     PUT m.hx%(hidx%),1,htitl$
  500.     PUT m.hx%(hidx%),19,nmen$
  501.    ENDIF
  502.    IF hidx%=0 OR nidx%=0 THEN
  503.     hidx%=0
  504.     nidx%=0
  505.    ENDIF
  506.    hopen!=FALSE
  507.   ELSE
  508.    ' Taste betaetigt
  509.    t$=UPPER$(CHR$(m.asc|))
  510.    IF hopen! THEN
  511.     ' Hauptmenue offen, Nebenmenues heruntergeklappt
  512.     ' Finde Nebenmenue-Index
  513.     idx%=0
  514.     REPEAT
  515.      INC idx%
  516.     UNTIL t$=m.nc$(hidx%,idx%) OR idx%>m.ns%(hidx%)
  517.     IF idx%<=m.ns%(hidx%) THEN
  518.      ' Gueltiger Nebenmenue-Index
  519.      IF idx%<>nidx% THEN
  520.       ' Nur wenn sich der Index geaendert hat!
  521.       IF nidx%>0 THEN
  522.        ' Alten Nebenmenue-Index, sofern schon invertiert, restaurieren
  523.        PUT m.hx%(hidx%)+2,5+nidx%*16,ntitl$
  524.       ENDIF
  525.       ' Endlich!
  526.       nidx%=idx%
  527.       GET m.hx%(hidx%)+2,5+nidx%*16,m.ne%(hidx%)-2,20+nidx%*16,ntitl$
  528.       PUT m.hx%(hidx%)+2,5+nidx%*16,ntitl$,10
  529.      ENDIF
  530.     ELSE
  531.      ' Buchstabe NICHT ein gueltiger Anfangsbuchstabe: Zuklappen
  532.      PUT m.hx%(hidx%),1,htitl$
  533.      PUT m.hx%(hidx%),19,nmen$
  534.      hidx%=0
  535.      nidx%=0
  536.      hopen!=FALSE
  537.     ENDIF
  538.    ELSE
  539.     @direkt_befehl
  540.     ' Nebenmenue noch nicht heruntergeklappt
  541.     idx%=0
  542.     REPEAT
  543.      INC idx%
  544.     UNTIL t$=m.hc$(idx%) OR idx%>m.hs%
  545.     IF idx%<=m.hs% THEN
  546.      ' Gueltiger Hauptmenue-Index
  547.      IF mx%<80 AND my%<18 THEN
  548.       ' Maus zeigt auf DESKTOP-Eintrag!
  549.       SETMOUSE m.hx%(idx%)+8,my%
  550.      ENDIF
  551.      IF idx%<>hidx% THEN
  552.       IF hidx%>0 THEN
  553.        PUT m.hx%(hidx%),1,htitl$
  554.        PUT m.hx%(hidx%),19,nmen$
  555.       ENDIF
  556.       hidx%=idx%
  557.       oldhidx%=idx%
  558.       GET m.hx%(hidx%),1,m.he%(hidx%),15,htitl$
  559.       PUT m.hx%(hidx%),1,htitl$,10
  560.       GET m.hx%(hidx%),19,m.ne%(hidx%),m.ns_pix%(hidx%),nmen$
  561.       DEFFILL 0,0
  562.       PBOX m.hx%(hidx%),19,m.ne%(hidx%),m.ns_pix%(hidx%)
  563.       BOX m.hx%(hidx%),19,m.ne%(hidx%),m.ns_pix%(hidx%)
  564.       FOR i%=1 TO m.ns%(hidx%)
  565.        IF m.n_geht!(hidx%,i%) THEN
  566.         DEFTEXT ,0,,13
  567.        ELSE
  568.         DEFTEXT ,2,,13
  569.        ENDIF
  570.        TEXT m.hx%(hidx%)+2,17+i%*16,m.n_titl$(hidx%,i%)
  571.        IF m.n_geht!(hidx%,i%) AND m.nc$(hidx%,i%)<"[" THEN
  572.         LINE m.hx%(hidx%)+3+m.nc_p%(hidx%,i%),19+i%*16,m.hx%(hidx%)+9+m.nc_p%(hidx%,i%),19+i%*16
  573.        ENDIF
  574.       NEXT i%
  575.       hopen!=TRUE
  576.      ENDIF
  577.     ELSE
  578.      ' Buchstabe KEIN gueltiger Hauptmenue-Anfangsbuchstabe
  579.      IF hidx%>0 THEN
  580.       ' Falls Nebenmenue offen und Hauptmenuepunkt invertiert: Zuklappen
  581.       PUT m.hx%(hidx%),1,htitl$
  582.       PUT m.hx%(hidx%),19,nmen$
  583.      ENDIF
  584.      hidx%=0
  585.      nidx%=0
  586.      hopen!=FALSE
  587.     ENDIF
  588.    ENDIF
  589.   ENDIF
  590.   '
  591.   IF hidx%>0 AND nidx%>0 THEN
  592.    PUT m.hx%(hidx%),1,htitl$
  593.    PUT m.hx%(hidx%),19,nmen$
  594.    no%=m.com_nr%(hidx%,nidx%)
  595.    hidx%=0
  596.    nidx%=0
  597.    hopen!=FALSE
  598.    @ausfuehren(no%,mk%)
  599.   ENDIF
  600.   '
  601.   EXIT IF abbruch!
  602.   '
  603.  LOOP
  604. RETURN ! main
  605. '
  606. PROCEDURE laden
  607.  LOCAL v$,in$
  608.  PRINT AT(1,1);cltoeol$;"   Name der 4096-Byte-Datei ? ";
  609.  v$=fnt$
  610.  FILESELECT "*.FNT",v$,in$
  611.  IF in$>"" AND EXIST(in$) THEN
  612.   fnt$=in$
  613.   OPEN "I",#1,fnt$
  614.   BGET #1,fntadr%,4096
  615.   CLOSE #1
  616.  ENDIF
  617.  @m_aufbau
  618. RETURN
  619. '
  620. PROCEDURE speichern
  621.  LOCAL v$,aus$
  622.  PRINT AT(1,1);cltoeol$;"   Abspeichern unter Namen ? ";
  623.  v$=fnt$
  624.  FILESELECT "*.FNT",v$,aus$
  625.  IF aus$>"" THEN
  626.   OPEN "O",#1,aus$
  627.   BPUT #1,fntadr%,4096
  628.   CLOSE #1
  629.  ENDIF
  630.  @m_aufbau
  631. RETURN
  632. '
  633. PROCEDURE hilfe
  634.  LOCAL k%,t%
  635.  IF tt! THEN
  636.   DEFFILL 1,2,7
  637.   PBOX 0,0,scrn_breit_pix%,scrn_hoeh_pix%
  638.  ELSE
  639.  ENDIF
  640.  DEFFILL 0,0
  641.  PBOX 0,0,639,399
  642.  PRINT AT(1,1);inv$;vers$;norm$
  643.  PRINT
  644.  PRINT " *** ";inv$;" WAHL d.BUCHSTABENS ";norm$;" *** mit Mausklick (Links/Rechts) oder '+'/'-' auf dem"
  645.  PRINT "  Nummernblock!"
  646.  PRINT
  647.  PRINT " *** PIXEL ";inv$;" SETZEN ";norm$;" *** mit LINKS-Klick, *** ";inv$;" LÖSCHEN ";norm$;" *** mit RECHTS-Klick"
  648.  PRINT
  649.  PRINT " *** MENÜ *** Da GFABasic 3.5E auf dem ATARI-TT mit TTM194 keine einwandfreie"
  650.  PRINT "  Menüleiste aufbauen kann, wurde die Menüsteuerung 'von Hand' programmiert."
  651.  PRINT "  Bis auf den Eintrag 'Desk' funktioniert Alles wie gewohnt - mit Ausnahme"
  652.  PRINT "  der alternativen Tastatursteuerung des Menüs (Unterstrichene Buchstaben)."
  653.  PRINT "  Zu jeder Funktion kommen Sie damit über 2 Tastendrücke. Das herunterklappen~"
  654.  PRINT "  de Menü muß Sie nicht stören."
  655.  PRINT "  Der 'Desk'-Eintrag ist in Kleinschrift. Hier kommt die normale Menü-Steuerung"
  656.  PRINT "  von GFABasic zum Einsatz. Beenden Sie die Anwahl des Eintrags immer korrekt!"
  657.  PRINT "  Sonst könnten Desk-Menü und ein anderes GLEICHZEITIG erscheinen! Der 1.Ein~"
  658.  PRINT "  trag unter 'Desk' baut den Bildschirm von FNT_ED.GFA neu auf."
  659.  PRINT
  660.  PRINT " *** RECHNER ***: ST+SM124 (MONO) und TT+TTM194 (MONO, Höchst-Auflösung)"
  661.  PRINT
  662.  PRINT " *** Aktuelle Daten ***"
  663.  PRINT " Zeichensatz-Puffer: ";inv$;
  664.  IF fntadr%=fnt1% THEN
  665.   PRINT "1";
  666.  ELSE
  667.   PRINT "2";
  668.  ENDIF
  669.  PRINT norm$;" Dateiname: '";inv$;fnt$;norm$;"'"
  670.  PRINT " Buchstabe: '";inv$;" ";CHR$(chr%);" ";norm$;"' (";STR$(chr%,3);" $";HEX$(chr%,2);" ";BIN$(chr%,8);")"
  671.  PRINT
  672.  PRINT AT(20,25);inv$;"Drücken Sie eine Taste auf der Tastatur oder der Maus ! ";norm$;
  673.  PAUSE 20
  674.  SHOWM
  675.  REPEAT
  676.   k%=MOUSEK
  677.   t%=GEMDOS(6,&HFF)
  678.  UNTIL k%>0 OR t%>0
  679.  HIDEM
  680.  @m_aufbau
  681. RETURN
  682. '
  683. PROCEDURE ausfuehren(num%,click%)
  684.  SELECT num%
  685.  CASE 1 ! COPYRIGHT
  686.   @laden
  687.  CASE 2 ! SPEICHERN
  688.   @speichern
  689.  CASE 3 ! QUIT
  690.   IF click%>0 THEN
  691.    PAUSE 20
  692.   ENDIF
  693.   ALERT 2,"FNT_ED.GFA|Wirklich Verlassen?",1,"JA|Nein",w%
  694.   IF w%=1 THEN
  695.    abbruch!=TRUE
  696.   ENDIF
  697.  CASE 4 ! WechsleFont
  698.   IF fntadr%=fnt1% THEN
  699.    fntadr%=fnt2%
  700.   ELSE
  701.    fntadr%=fnt1%
  702.   ENDIF
  703.   @m_aufbau
  704.  CASE 6 ! BLANK
  705.   FOR i%=fntadr% TO fntadr%+4093 STEP 4
  706.    {i%}=0
  707.   NEXT i%
  708.   @m_aufbau
  709.  CASE 7 ! SYSTEM-Font
  710.   BMOVE sysfnt%,fntadr%,4096
  711.   @m_aufbau
  712.  CASE 8 ! INVERTIEREN
  713.   FOR i%=fntadr% TO fntadr%+4093 STEP 4
  714.    {i%}=NOT {i%}
  715.   NEXT i%
  716.   @m_aufbau
  717.   ' 9 ! VerDÜNNEN
  718.   ' 10 ! VerFETTEN
  719.   ' 23 ! ROTIEREN
  720.  CASE 15 ! COPY Char
  721.   @copy_char
  722.  CASE 16 ! PASTE Char
  723.   @paste_char
  724.  CASE 17 ! KILL Char
  725.   @kill_char
  726.  CASE 18 ! INVERT Char
  727.   @invert_char
  728.  CASE 19 ! TAUSCHE Char
  729.   @tausch_char
  730.  CASE 22 ! HILFE
  731.   @hilfe
  732.  CASE 25 ! RASTER
  733.   u_raster!=NOT u_raster!
  734.   @m_aufbau
  735.  DEFAULT
  736.   IF click%>0 THEN
  737.    PAUSE 20
  738.   ENDIF
  739.   ALERT 1,"Funktion "+STR$(no%)+"|Noch nicht|Implementiert!",1,"WEITER",dummy%
  740.  ENDSELECT
  741. RETURN ! ausfuehren
  742. '
  743. PROCEDURE direkt_befehl
  744.  LOCAL x%,y%,k%
  745.  LOCAL adr%,i%,w|
  746.  adr%=SHL(chr%,4)
  747.  ADD adr%,fntadr%
  748.  ' ALERT 1,"m.scan:"+STR$(m.scan|)+"|m.asc:"+STR$(m.asc|),1,"R",d%
  749.  SELECT m.scan|
  750.  CASE &H4B
  751.   ' Nach links
  752.   FOR i%=0 TO 15
  753.    BYTE{ADD(adr%,i%)}=ROL|(BYTE{ADD(adr%,i%)},1)
  754.    @update_line(i%)
  755.   NEXT i%
  756.   @update_char
  757.  CASE &H4D
  758.   ' Nach rechts
  759.   FOR i%=0 TO 15
  760.    BYTE{ADD(adr%,i%)}=ROR|(BYTE{ADD(adr%,i%)},1)
  761.    @update_line(i%)
  762.   NEXT i%
  763.   @update_char
  764.  CASE &H48
  765.   ' Nach oben
  766.   w|=BYTE{adr%}
  767.   FOR i%=0 TO 14
  768.    BYTE{ADD(adr%,i%)}=BYTE{ADD(adr%,i%)+1}
  769.   NEXT i%
  770.   BYTE{ADD(adr%,15)}=w|
  771.   @char_anzeige
  772.   @update_char
  773.  CASE &H50
  774.   ' Nach unten
  775.   w|=BYTE{ADD(adr%,15)}
  776.   FOR i%=15 TO 1 STEP -1
  777.    BYTE{ADD(adr%,i%)}=BYTE{ADD(adr%,i%)-1}
  778.   NEXT i%
  779.   BYTE{adr%}=w|
  780.   @char_anzeige
  781.   @update_char
  782.  CASE &H4A ! -
  783.   @box_um_char(TRUE)
  784.   DEC chr%
  785.   IF chr%<0 THEN
  786.    chr%=255
  787.   ENDIF
  788.   @char_anzeige
  789.   @box_um_char(FALSE)
  790.  CASE &H4E ! +
  791.   @box_um_char(TRUE)
  792.   INC chr%
  793.   IF chr%>255 THEN
  794.    chr%=0
  795.   ENDIF
  796.   @char_anzeige
  797.   @box_um_char(FALSE)
  798.  CASE 46 ! COPY Char
  799.   @copy_char
  800.  CASE 25 ! PASTE Char
  801.   @paste_char
  802.  CASE 23 ! INVERT Char
  803.   @invert_char
  804.  CASE 20 ! TAUSCHE Char
  805.   @tausch_char
  806.  ENDSELECT
  807. RETURN ! rotate_char
  808. '
  809. PROCEDURE tausch_char
  810.  LOCAL offs%,i%
  811.  offs%=SHL(chr%,4)
  812.  IF fntadr%=fnt1% THEN
  813.   BMOVE ADD(fnt2%,offs%),ADD(fnt1%,offs%),16
  814.  ELSE
  815.   BMOVE ADD(fnt1%,offs%),ADD(fnt2%,offs%),16
  816.  ENDIF
  817.  ADD offs%,fntadr%
  818.  @char_anzeige
  819.  @update_char
  820. RETURN ! tausch_char
  821. '
  822. PROCEDURE invert_char
  823.  LOCAL adr%,i%
  824.  adr%=SHL(chr%,4)
  825.  ADD adr%,fntadr%
  826.  FOR i%=0 TO 15
  827.   BYTE{adr%}=NOT BYTE{adr%}
  828.   INC adr%
  829.   @update_line(i%)
  830.  NEXT i%
  831.  @update_char
  832. RETURN ! invert_char
  833. '
  834. PROCEDURE kill_char
  835.  LOCAL adr%,i%
  836.  adr%=SHL(chr%,4)
  837.  ADD adr%,fntadr%
  838.  FOR i%=0 TO 15
  839.   BYTE{adr%}=0
  840.   INC adr%
  841.   @update_line(i%)
  842.  NEXT i%
  843.  @update_char
  844. RETURN ! kill_char
  845. '
  846. PROCEDURE copy_char
  847.  LOCAL adr%,i%
  848.  adr%=SHL(chr%,4)
  849.  ADD adr%,fntadr%
  850.  FOR i%=0 TO 15
  851.   cpuf|(i%)=BYTE{adr%}
  852.   INC adr%
  853.  NEXT i%
  854. RETURN ! copy_char
  855. '
  856. PROCEDURE paste_char
  857.  LOCAL adr%,i%
  858.  adr%=SHL(chr%,4)
  859.  ADD adr%,fntadr%
  860.  FOR i%=0 TO 15
  861.   BYTE{adr%}=cpuf|(i%)
  862.   INC adr%
  863.   @update_line(i%)
  864.  NEXT i%
  865.  @update_char
  866. RETURN ! paste_char
  867. '
  868. PROCEDURE m_getkey
  869.  m.key&=MENU(14)
  870. RETURN
  871. '
  872. PROCEDURE m_deal
  873.  @m_aufbau
  874. RETURN ! m_deal
  875. '
  876. PROCEDURE schluss
  877.  MENU KILL
  878.  END
  879. RETURN ! abmelden
  880. '
  881.